//############################################################
// FILE: Task_function.c
// Created on: 2017年1月18日
// Author: XQ
// summary: Task_function
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//版权所有，盗版必究
//DSP/STM32电机控制开发板
//硕历电子
//网址: https://shuolidianzi.taobao.com
//Author-QQ: 616264123
//电机控制QQ群：314306105
//############################################################

#include "Task_function.h"
#include "Timer.h"
#include "PI_Cale.h"
#include "main_user.h"
#include "Axis_transform.h"
#include "FOC_run.h"

extern  IPARK          IparkU;
extern  TaskTime       TaskTimePare;
extern  PI_Control     pi_spd  ;
extern  PI_Control     pi_id   ;
extern  PI_Control     pi_iq   ;
extern  logic          logicContr;
 
void knob_control(void)
{
   /*** 1、 根据电位器信号判断是否启动电机以及目标值***/
	if( ADCSampPare.RP_speed_Voltage<= 200) 
	{
	   // 启动电机控制需要初始化参数，三个PI环路参数	
		 logicContr.drive_car=0;
		 logicContr.Start_order=0;
		 logicContr.Qiehuan_count=0;

		 pi_spd.Fbk=0;
		 pi_spd.Ref=0;
		 pi_id.Ref=0;
		 pi_iq.Ref=0;
		 IparkU.Qs=0;
		 IparkU.Qs=0;

	   pi_spd.up=0;
	   pi_spd.ui=0;
	   pi_spd.v1=0;
	   pi_spd.i1=0;
	   pi_spd.Out=0;
	   pi_spd.OutF=0;

	   pi_id.up=0;
	   pi_id.ui=0;
	   pi_id.v1=0;
	   pi_id.i1=0;
	   pi_id.Out=0;

	   pi_iq.up=0;
	   pi_iq.ui=0;
	   pi_iq.v1=0;
	   pi_iq.i1=0;
	   pi_iq.Out=0;
	}
	else
	{
		logicContr.drive_car=1;
		
		if(logicContr.Run_mode==5)  //只有电流内环
        {
//			pi_iq.Ref = (int32_t)(ADCSampPare.RP_speed_Voltage >> 2);
//			if( pi_iq.Ref>=1000)
//			{
//				pi_iq.Ref=1000;
//			}				       
		} 
		else
		{
			 pi_spd.Ref = (int32_t)(ADCSampPare.RP_speed_Voltage >> 1);   // 电位器转速信号
			 //限制最大2000RPM，由于霍尔角度估算还是其他问题，大于2000转时转速估计突然到上限值，表现为会发生电机抽动现象
		   //一到2000多转就发生该情况
 	     if( pi_spd.Ref>=2000)  
 	        pi_spd.Ref=2000;
		}
 
	}

	
	/*** 2、 状态机 根据电机状态执行电机启停 ***/
	 if ((logicContr.olddrive_car==0) &&( logicContr.drive_car==1 ))  //说明电机开始启动
	 {
		logicContr.Start_order=1;
		
		ThreeHallPara_init();
	 }
	 else if ((logicContr.olddrive_car==1) &&( logicContr.drive_car==1 ))  //说明电机已经启动
	 {
			
			StartPWM();		// start mcu pwm output.
	 }
	 else          //说明电机已经停止
	 {
		 StopPWM();		// stop mcu pwm output.
		 logicContr.Start_order=0;
	 }
	 logicContr.olddrive_car=logicContr.drive_car;
 
}


void StopPWM(void)
{
	extern TIM_HandleTypeDef htim1;
	HAL_TIM_PWM_Stop( &htim1, TIM_CHANNEL_1);
	HAL_TIM_PWM_Stop( &htim1, TIM_CHANNEL_2);
	HAL_TIM_PWM_Stop( &htim1, TIM_CHANNEL_3);
	HAL_TIMEx_PWMN_Stop( &htim1, TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Stop( &htim1, TIM_CHANNEL_2);
	HAL_TIMEx_PWMN_Stop( &htim1, TIM_CHANNEL_3);
}

void StartPWM(void)
{
	extern TIM_HandleTypeDef htim1;
	HAL_TIM_PWM_Start( &htim1, TIM_CHANNEL_1);
	HAL_TIM_PWM_Start( &htim1, TIM_CHANNEL_2);
	HAL_TIM_PWM_Start( &htim1, TIM_CHANNEL_3);
	HAL_TIMEx_PWMN_Start( &htim1, TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Start( &htim1, TIM_CHANNEL_2);
	HAL_TIMEx_PWMN_Start( &htim1, TIM_CHANNEL_3);
}
//===========================================================================
// No more.
//===========================================================================
